//业务相关
//node核心模块
const path = require('path');

//第三方模块
const Koa = require('koa');
//注册koa-body中间件，解析请求体参数，挂载到ctx.request.body
const { koaBody } = require('koa-body');
const KoaStatic = require('koa-static')
//用于参数校验的模块
const parameter = require('koa-parameter')

//自定义模块
const errHandler = require('./errHandler')
//自定义的路由
const router = require('../router')

//程序入口
const app = new Koa();


//全局中间件函数
async function record(ctx, next){
    ctx.set("Access-Control-Allow-Origin", "*");
    ctx.set("Access-Control-Allow-Headers", "*");
    //必须必须加await
    await next();
}

app.use(record)
//在所有中间件前
app.use(koaBody({
    //开启文件上传
    multipart: true,
    //指定哪些http方法的请求体被解析
    parsedMethods: ['POST', 'PUT', 'DELETE', 'PATCH'],
    //配置表单的文件上传
    formidable:{
        //不推荐使用相对路径，因为根目录是相对KoaBody脚本执行的地方
        uploadDir: path.join(__dirname, '../upload'),//文件放到哪个目录下
        keepExtensions : true,//保留文件扩展名
        maxFileSize: 200 * 1024 * 1024, // 限制文件大小为200MB
        onFileBegin: (name, file) => {
            // 限制文件格式为jpg、png、gif
            const allowedExtensions = ['.jpg', '.png', '.gif'];
            const extension = path.extname(file.filepath);
            if (!allowedExtensions.includes(extension)) {
              throw new Error(`Invalid file extension. Only ${allowedExtensions.join(', ')} are allowed.`);
            }
          }
    }
}));
//配置静态资源
app.use(KoaStatic(path.join(__dirname, '../upload')))
app.use(parameter(app))
//注册中间件,注意顺序
app.use(router.routes())
app.use(router.allowedMethods())//对偏门请求方式，返回500

//统一的错误处理，监听自定义的error事件
app.on('error', errHandler)

module.exports = app;